package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import Negocio.Usuario;
import Negocio.Linea;
import Negocio.ItemFactura;

import Negocio.Factura;
import Persistencia.AdministradorPersistenciaFactura;
import Persistencia.PoolConnection;

public class AdministradorPersistenciaFactura {
private static AdministradorPersistenciaFactura instancia;
	
	private AdministradorPersistenciaFactura(){
		
	}
	
	public static AdministradorPersistenciaFactura getInstancia(){
		if (instancia == null){
			instancia = new AdministradorPersistenciaFactura();
		}
		return instancia;
	}
	
	
	public void insertFactura(Factura f){
		
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			
			//Insertar Factura
			PreparedStatement ps = con.prepareStatement("INSERT INTO Facturas (nro_Factura, periodo, fecha_vencimiento, estado, total_factura, dni, numero_linea) VALUES (?,?,?,?,?,?,?)");
			ps.setInt(1, f.getNumero());
			ps.setDate(2, (java.sql.Date) f.getPeriodo());
			ps.setDate(3, (java.sql.Date) f.getFechaVencimiento());
			ps.setString(4, f.getEstado());
			ps.setFloat(5, f.getTotal());
			ps.setString(6, f.getUsuario().getDni());
			ps.setString(7, f.getLinea().getNumero());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

    public void insertItemFactura(int numeroDeFactura, ItemFactura itemFactura){
		
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			
			//Insertar Item Factura
			PreparedStatement ps = con.prepareStatement("INSERT INTO Items_Factura (nro_item, nombre_item, importe, nro_factura) VALUES (?,?,?,?)");
			ps.setInt(1, itemFactura.getNroItem());
			ps.setString(2, itemFactura.getNombreServicio());
			ps.setFloat(3, itemFactura.getImporte());	
			ps.setInt(4, numeroDeFactura);
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    
    public Factura select(int nroFactura){
    	Connection con = PoolConnection.getPoolConnection().getConnection();
		try{
			PreparedStatement ps = con.prepareStatement("SELECT * from Facturas where nro_Factura = ?");
			ps.setInt(1, nroFactura);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				Vector<ItemFactura> items = new Vector<ItemFactura>();
				String dniUsuario = rs.getString("dni");
				Usuario usuarioActual = AdministradorPersistenciaUsuario.getInstancia().buscarUsuario(dniUsuario);
				String nroLinea = rs.getString("numero_linea");
				Linea lineaActual = AdministradorPersistenciaLinea.getInstancia().buscarLineaTitular(nroLinea);
				if (lineaActual==null) // Si no encuentra al nro de Linea como Titular, lo busca como Adicional
					lineaActual = AdministradorPersistenciaLinea.getInstancia().buscarLineaAdicional(nroLinea);
				float total = rs.getFloat("total_factura");
				Date periodo = rs.getDate("periodo");
				Date fechaVencimiento = rs.getDate("fecha_vencimiento");
				String estado = rs.getString("estado");
				PreparedStatement ps2 = con.prepareStatement("SELECT * from Items_Factura where nro_Factura = ?");
				ps2.setInt(1, nroFactura);
				ResultSet itItems = ps2.executeQuery();
				while(itItems.next()){
					String nombreServicio = itItems.getString("nombre_servicio");
					int nroItem = itItems.getInt("nro_item");
					float importe = itItems.getFloat("importe");
					int cantidad = itItems.getInt("cantidad_consumida");
					ItemFactura item = new ItemFactura(nombreServicio, nroItem, importe, cantidad);
					items.add(item);
				}
				Factura facturaActual = new Factura(items, nroFactura, total, periodo, fechaVencimiento, estado, lineaActual, usuarioActual);
				itItems.close();
				ps2.close();
				rs.close();
				ps.close();
				return facturaActual;
			}
			rs.close();
			ps.close();
		}
		catch(Exception e){
			System.out.println("Error en Buscar Factura");
			e.printStackTrace();
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return null;
	}

}
